/**
 * @addtogroup mfc_mem
 * mfc_mem
 * @{
 */
/**
 * @file         mfc_mem.h
 * @brief        内存编解码接口组
 * @note         所有接口内部不判断参数有效性，需要外部自己判断
 * @author       尤胜坤[Akee](ysk@hopechart.com)
 * @date         2019-9-23
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2019-9-23   <td>1.0                   <td>Akee            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _MFC_MEM_H_
#define _MFC_MEM_H_

#include "ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 获取1个字节
 * @param mem: 需要获取的内存地址
 * @return 获取值
 */
Byte MfMemGetByte(Byte *mem);

/**
 * 获取n个字节
 * @param mem: 需要获取的内存地址
 * @param value: 获取的值地址
 * @param count: 获取个数
 * @return 
 */
void MfMemGetBytes(Byte *mem, Byte *value, Int32 count);

/**
 * 获取2个字节
 * @param mem: 需要获取的内存地址
 * @param conv_byte_order: 是否转换字节序
 * @return 获取值
 */
Word MfMemGetWord(Byte *mem, Bool conv_byte_order);

/**
* 获取2个字节
* @param mem: 需要获取的内存地址
* @param value: 获取后存放的内存地址
* @param conv_byte_order: 是否转换字节序
* @return 获取值
*/
void MfMemGetWordValue(Byte *mem, Word *value, Bool conv_byte_order);

/**
 * 获取2个字节
 * @param mem: 需要获取的内存地址
 * @param value: 获取的值地址
 * @param count: 获取个数
 * @param conv_byte_order: 是否转换字节序
 * @return 
 */
void MfMemGetWords(Byte *mem, Word *value, Int32 count, Bool conv_byte_order);

/**
 * 获取4个字节
 * @param mem: 需要获取的内存地址
 * @param conv_byte_order: 是否转换字节序
 * @return 获取值
 */
DWord MfMemGetDWord(Byte *mem, Bool conv_byte_order);

/**
* 获取4个字节
* @param mem: 需要获取的内存地址
* @param value: 获取后存放的内存地址
* @param conv_byte_order: 是否转换字节序
* @return 获取值
*/
void MfMemGetDWordValue(Byte *mem, DWord *value, Bool conv_byte_order);

/**
 * 获取4个字节
 * @param mem: 需要获取的内存地址
 * @param value: 获取的值地址
 * @param count: 获取个数
 * @param conv_byte_order: 是否转换字节序
 * @return 
 */
void MfMemGetDWords(Byte *mem, DWord *value, Int32 count, Bool conv_byte_order);

/**
 * 获取8个字节
 * @param mem: 需要获取的内存地址
 * @param conv_byte_order: 是否转换字节序
 * @return 获取值
 */
QWord MfMemGetQWord(Byte *mem, Bool conv_byte_order);

/**
* 获取8个字节
* @param mem: 需要获取的内存地址
* @param value: 获取后存放的内存地址
* @param conv_byte_order: 是否转换字节序
* @return 获取值
*/
void MfMemGetQWordValue(Byte *mem, QWord *value, Bool conv_byte_order);

/**
 * 获取8个字节
 * @param mem: 需要获取的内存地址
 * @param value: 获取的值地址
 * @param count: 获取个数
 * @param conv_byte_order: 是否转换字节序
 * @return 
 */
void MfMemGetQWords(Byte *mem, QWord *value, Int32 count, Bool conv_byte_order);


/**
 * 设置1个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetByte(Byte *mem, Byte value);

/**
 * 设置1个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param count: 设置个数
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetBytes(Byte *mem, Byte *value, Int32 count);

/**
 * 设置2个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetWord(Byte *mem, Word value, Bool conv_byte_order);

/**
 * 设置2个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param count: 设置个数
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetWords(Byte *mem, Word *value, Int32 count, Bool conv_byte_order);


/**
 * 设置4个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetDWord(Byte *mem, DWord value, Bool conv_byte_order);

/**
 * 设置4个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param count: 设置个数
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetDWords(Byte *mem, DWord *value, Int32 count, Bool conv_byte_order);

/**
 * 设置8个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetQWord(Byte *mem, QWord value, Bool conv_byte_order);

/**
 * 设置8个字节的数据
 * @param mem: 需要获取的内存地址
 * @param value: 数据内容
 * @param count: 设置个数
 * @param conv_byte_order: 是否转换字节序
 * @return 设置完成后偏移后的地址
 */
Byte *MfMemSetQWords(Byte *mem, QWord *value, Int32 count, Bool conv_byte_order);

#ifdef __cplusplus
}
#endif
#endif
/**
 * @}
 */


